package main.leetcode.clockin.May;

/**
 * 50.Pow(x, n)
 *
 * <p>实现 pow(x, n) ，即计算 x 的 n 次幂函数。
 *
 * <p>示例 1: 输入: 2.00000, 10 输出: 1024.00000
 *
 * <p>示例 2: 输入: 2.10000, 3 输出: 9.26100
 *
 * <p>示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25
 *
 * <p>说明: -100.0 < x < 100.0 n 是 32 位有符号整数，其数值范围是 [−231, 231 − 1] 。
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/powx-n 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class day11 {
    public static void main(String[] args) {
        System.out.println(new day11().myPow(2, -2));
    }

    public double myPow(double x, int n) {
        // 作缓存
        int tmp = n >= 0 ? n : -n;
        // 记录结果
        double res = 1;
        // 当其为0时，说明二进制位上已没有 1
        while (tmp != 0) {
            // 当前最低位为1时，进行计算
            if ((tmp & 1) == 1) {
                res *= x;
            }
            // 下一次要乘的数
            x *= x;
            // 当前二进制位已计算，无符号右移
            tmp >>>= 1;
        }
        // 判断正负次幂
        return n >= 0 ? res : 1 / res;
    }
}
